
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>谈谈迭代器的原理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>谈谈迭代器的原理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">迭代器（Iterator）设计模式的核心原理是什么？它如何帮助客户端代码？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">迭代器的原理在于将遍历行为封装在一个迭代器对象中。这使得客户端代码可以按照统一的方式来访问容器中的元素，而不需要了解容器的具体实现细节，从而实现客户端代码与容器实现的解耦。</div>
          </div>
          <div class="card-source">来源: 谈谈迭代器的原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">接口</div>
          <div class="card-question">一个典型的迭代器接口通常包含哪三个核心操作方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">接口</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">典型的迭代器接口通常包含三个核心方法：1. `hasNext()` 用于检查是否还有下一个元素；2. `next()` 用于获取下一个元素；3. `remove()` 用于从容器中移除当前元素（此操作可能不被所有迭代器支持）。</div>
          </div>
          <div class="card-source">来源: 接口设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">作为一种行为型设计模式，迭代器模式如何降低客户端代码与容器之间的耦合度？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">迭代器模式通过将迭代行为封装在迭代器对象中，使得客户端代码与容器的具体实现解耦。这样，容器可以随意更改其内部结构，而不会影响到使用迭代器进行遍历的客户端代码。</div>
          </div>
          <div class="card-source">来源: 迭代器模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实现</div>
          <div class="card-question">在Java中，迭代器通常是如何与容器类结合实现的？这种实现方式有什么优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实现</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在Java中，迭代器通常是作为容器类的内部类来实现的。这种方式的优势在于，内部类可以直接访问容器类的私有字段，从而能够提供对容器元素的安全访问。</div>
          </div>
          <div class="card-source">来源: 迭代器的实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">迭代器内部是如何实现对容器元素的顺序访问的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">迭代器通过在内部维护一个指向当前元素的游标来实现顺序访问。每次调用 `next()` 方法时，游标会向前移动一个位置，并返回当前位置的元素。这样就实现了对容器元素的逐个访问，而无需暴露容器的内部数据结构。</div>
          </div>
          <div class="card-source">来源: 迭代器的内部原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Java中的foreach循环和迭代器之间有什么关系？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在Java中，foreach循环本质上是一种语法糖。在编译时，foreach循环会被转换成使用迭代器的方式来遍历集合或数组。因此，无论是直接使用迭代器还是foreach循环，底层都是通过迭代器机制实现对容器元素的顺序访问。</div>
          </div>
          <div class="card-source">来源: 迭代器与foreach循环</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">性能</div>
          <div class="card-question">使用迭代器遍历一个包含n个元素的集合，其时间和空间复杂度通常是多少？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">性能</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">对于大多数集合类型，迭代器遍历的时间复杂度为 O(n)，因为需要依次访问每个元素。其空间复杂度通常较低，因为迭代器对象只需要存储游标位置等少量状态信息，与容器本身相比可以忽略不计。</div>
          </div>
          <div class="card-source">来源: 迭代器的性能</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">并发</div>
          <div class="card-question">在多线程环境下，当一个线程正在使用迭代器遍历容器，而另一个线程修改了该容器时，可能会发生什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">并发</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在多线程环境下，如果一个线程对容器进行了修改，而另一个线程正在遍历该容器，可能会导致迭代器抛出 `ConcurrentModificationException` 异常。这是因为迭代器通常是单线程的，其内部状态可能会因外部修改而变得不一致。</div>
          </div>
          <div class="card-source">来源: 迭代器的线程安全性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中提到了哪些方法可以实现线程安全的迭代器操作？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">为了解决线程安全问题，可以使用线程安全的容器或对迭代器进行同步控制。例如，可以使用 `Collections.synchronizedList()` 方法创建线程安全的列表，或者使用像 `ConcurrentHashMap` 这样的并发容器类，它们都提供了线程安全的迭代器。</div>
          </div>
          <div class="card-source">来源: 迭代器的线程安全性</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
